package com.java.net;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Tomcat {

    /**
     * 核心线程数(池中线程数小于核心线程数时，每来一个请求都会创建一个新的线程)
     */
    private static int corePoolSize = 8;
    /**
     * 阻塞式队列
     * 当池中线程已经达到了corePoolSize这个值，并且这些线程都在忙，此时再有新的任务可以
     * 将任务暂时存放到这个队列中
     */
    private static BlockingQueue<Runnable> blockingQueue =
            new ArrayBlockingQueue<>(100);
    /**
     * 最大线程数(当池中线程数已经达到8，并且队列中也满了，但是这些线程都在忙，又来了新的请求)
     * 此时要继续创建线程，但最多为maximumPoolSize
     */
    private static int maximumPoolSize = 256;
    /**
     * 线程空闲时间(请求并发过后，池中线程空闲了，假如长时间不被应用，它也是耗费资源，
     * 所以在一定时间过后，可以释放一些线程)
     */
    private static long keepAliveTime = 60;
    /**
     * 时间单位
     */
    private static TimeUnit unit = TimeUnit.SECONDS;

    /**
     * 初始化一个线程池,通过线程池中的线程处理客户端的请求
     */
    private static ThreadPoolExecutor poolExecutor =
            new ThreadPoolExecutor(corePoolSize,
                    maximumPoolSize, keepAliveTime,
                    unit, blockingQueue);

    public static void main(String[] args) throws IOException {
        //1.构建服务器对象(Java中使用ServerSocket构建服务器对象)
        ServerSocket server = new ServerSocket(9999);//http://localhost:9999
        System.out.println("server start .....");
        //2.等待客户端的连接(Java中Socket代表客户端对象)
        while (true) {//这里使用无限循环表示可以处理客户端的多次请求
            Socket client = server.accept();//accept是一个阻塞式方法，用于等待客户端的连接
            //获取网络中的输出流对象，基于输出流对象向客户端写数据
            OutputStream out = client.getOutputStream();
            String data = "HTTP/1.1 200 OK \n\r" +
                    "Content-Type: text/html;charset=utf-8 \n\r" +
                    "\n\r" +
                    "Hello Client Browser";
            out.write(data.getBytes());
            out.flush();
            client.close();
        }
    }
}
